home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <time.h>
- #include "werr.h"
- #include "global.h"
- #include "mbuf.h"
- #include "internet.h"
- #include "iface.h"
- #include "cmdparse.h"
- #include "misc.h"
- #include "driver.h"
- #include "slip.h"
- #include "arc.h"
- #include "os.h"
- #include "swis.h"
-
- struct driver driver[DRIVER_MAX];
- unsigned int ndriver;
- extern struct interface *ifaces;
-
- extern char nospace[];
-
- static int driver_init(int16, struct interface *, char *, int);
- static int driver_stop(struct interface *);
- static int driver_speed(int16, int);
- static int driver_output(int16, char *, int);
- static int driver_recv(int16, char *, int);
-
- /* Attach a serial interface to the system
- * argv[0]: hardware type, must be "driver"
- * argv[1]: driver name
- * argv[2]: port number
- * argv[3]: mode, may be:
- * "slip" (point-to-point SLIP)
- * argv[4]: interface label, e.g., "sl0"
- * argv[5]: maximum transmission unit, bytes
- * argv[6]: interface speed, e.g, "9600"
- */
- int driver_attach(int argc, char **argv)
- {
- struct interface *if_driver;
- struct slip *if_slip;
- int16 dev;
- int mode;
- char buffer[60];
- FILE *fp;
-
- argc = argc;
-
- if (ndriver >= DRIVER_MAX){
- werr(1,"Too many asynch controllers\n");
- return -1;
- }
-
- sprintf(buffer, "SerialDev:Modules.%s.Driver", argv[1]);
- if ((fp = fopen(buffer, "rb")) == NULL) {
- werr(1,"Invalid block driver %s\n", argv[1]);
- return -1;
- }
- fclose(fp);
-
- if(strcmp(argv[3],"slip") == 0)
- mode = SLIP_MODE;
- else
- mode = UNKNOWN;
-
- dev = ndriver++;
-
- /* Create interface structure and fill in details */
- if_driver = (struct interface *)calloc(1,sizeof(struct interface));
- if_driver->name = strdup(argv[4]);
- if_driver->mtu = atoi(argv[5]);
- if_driver->dev = dev;
- if_driver->recv = doslip;
- if_driver->stop = driver_stop;
- if_driver->put = driver_output;
- if_driver->get = driver_recv;
-
- switch(mode){
- case SLIP_MODE:
- if_slip = (struct slip *)calloc(1,sizeof(struct slip));
- if_driver->slip = if_slip;
- if_driver->send = slip_send;
- if_driver->raw = slip_raw;
- if_driver->slip->recv = slip_recv;
- break;
- default:
- werr(1,"Mode %s unknown for interface %s",argv[3],argv[4]);
- free(if_driver->name);
- free(if_driver);
- ndriver--;
- return -1;
- }
- if_driver->next = ifaces;
- ifaces = if_driver;
- driver_init(dev, if_driver, argv[1], atoi(argv[2]));
- driver_speed(dev, atoi(argv[6]));
-
- return 0;
- }
-
- /* Initialize driver port "dev" */
- static int driver_init(int16 dev, struct interface *iface, char *name, int port)
- {
- char buffer[60];
- int Length;
- char *pointer;
- FILE *fp;
-
- sprintf(buffer, "SerialDev:Modules.%s.Driver", name);
- if ((fp = fopen(buffer, "rb")) == NULL)
- {
- werr(1, "Failed to open %s\n", buffer);
- return(0);
- }
-
- fseek(fp, 0L, SEEK_END);
- Length = (int)(ftell(fp) + 1L);
-
- if ((pointer = malloc(Length)) == NULL)
- {
- werr(1,nospace);
- fclose(fp);
- return(0);
- }
-
- fseek(fp, 0L, SEEK_SET);
- fread(pointer, 1, Length, fp);
- memcpy(&driver[dev].port, pointer + 0x0C8, sizeof(int));
- fclose(fp);
-
- driver[dev].iface = iface;
- driver[dev].speed = 9600;
- driver[dev].name = strdup(name);
- driver[dev].port += port;
- driver[dev].driver = (int (*)())pointer;
-
- /* Initialise port to 9600 Baud, 8 bits etc */
- (*driver[dev].driver)(DRIVER_INITIALISE, driver[dev].port);
- (*driver[dev].driver)(DRIVER_TXSPEED, driver[dev].port, 9600);
- (*driver[dev].driver)(DRIVER_RXSPEED, driver[dev].port, 9600);
- (*driver[dev].driver)(DRIVER_WORDFORMAT, driver[dev].port, 0x00);
- (*driver[dev].driver)(DRIVER_CONTROLLINES, driver[dev].port, 3);
-
- return(1);
- }
-
- static int driver_stop(struct interface *iface)
- {
- /* Drop RTS/DSR */
- (*driver[iface->dev].driver)(DRIVER_CONTROLLINES, driver[iface->dev].port,0);
-
- /* Closedown */
- (*driver[iface->dev].driver)(DRIVER_CLOSEDOWN, driver[iface->dev].port);
-
- return(0);
- }
-
- /* Set line speed */
- static int driver_speed(int16 dev, int speed)
- {
- if (speed == 0 || dev >= ndriver) return(-1);
-
- driver[dev].speed = speed;
-
- /* Set speed */
- (*driver[dev].driver)(DRIVER_TXSPEED, driver[dev].port, speed);
- (*driver[dev].driver)(DRIVER_RXSPEED, driver[dev].port, speed);
-
- /* Check its been set */
- if ((*driver[dev].driver)(DRIVER_RXSPEED, driver[dev].port, -1) != speed)
- {
- werr(0, "Invalid speed %d Baud", speed);
- return(-1);
- }
-
- return(0);
- }
-
- /* Send a buffer to transmitter */
- static int driver_output(int16 dev, char *buf, int cnt)
- {
- register int i;
-
- if (dev >= ndriver) return(0);
-
- for (i = 0; i < cnt && (*driver[dev].driver)(DRIVER_PUTBYTE, driver[dev].port, *buf) == 0; i++, buf++);
-
- return(i);
- }
-
- /* Receive characters from line
- * Returns count of characters read
- */
- static int driver_recv(int16 dev, char *buf, int cnt)
- {
- register int c;
-
- if (dev >= ndriver || cnt < 1) return(0);
-
- c = (*driver[dev].driver)(DRIVER_GETBYTE, driver[dev].port);
-
- if (c >= 0)
- {
- *buf = c;
- return(1);
- }
-
- return(0);
- }
-
-